/*ADC。目前仅GPIO7、8、9、10、11、12支持ADC，分别对应通道0~5。*/
#include "pH_TDS_DO_LIGHT.h"
#include "main.h"
#include "osal_debug.h"
#include <math.h>
#include "../../../../include/driver/adc.h"
#include <string.h>

#include "pinctrl.h"
#include "common_def.h"
#include "soc_osal.h"
#include "osal_wait.h"
#include "app_init.h"

uint8_t now_index;//用于定义目前的通道对应的值在发送缓冲区的索引。用于通过sle把数据发送出去，可以删除
uint32_t pH = 0;
uint32_t tds = 0;
uint32_t do_value = 0;
uint32_t light = 0;

adc_scan_config_t config = {
        .type = 0,
        .freq = 1,
    };
/*
void *memcpy(void * dest, const void * src, int num)
{
    uint8_t *ptr_d = (uint8_t *)dest;
    uint8_t *ptr_s = (uint8_t *)src;
    uint8_t i = 0;
    for(i = 0;i < num;i++)
    {
        *(ptr_d + i) = *(ptr_s + num - 1 - i);
    }
    return ptr_d;
}
*/
/*
自动扫描回调函数。SDK中的手动采样接口不知道为何返回的永远是0，因此还是选择了使用和例程当中一样的自动扫描，在回调函数
中进行处理。触发回调时buffer内存的就是关闭前读到的所以采样值，但也无所谓，取其第一个总是不会错的，尤其是只需要一个值
的时候
*/
void test_adc_callback(uint8_t ch, uint32_t *buffer, uint32_t length, bool *next) 
{
    
    float ret = 0;
    if(now_index == DO)
    {
        ret = (float)buffer[0] / 5000.0 * 20.0;
        osal_printk("DO:%d.%dmg/L, ", (int)ret, (int)(ret * 100.f) - (int)ret * 100);
    }
    else if(now_index == PH)
    {
        ret = (float)buffer[0] / 1000.0 * (-5.9647) + 22.255;
        osal_printk("PH:%d.%d, ", (int)ret, (int)(ret * 100.f) - (int)ret * 100);
    }
    else if(now_index == TDS)
    {
        ret = 66.71 * ((float)buffer[0] / 1000.0) * (buffer[0] / 1000.0) * (buffer[0] / 1000.0) - 127.93 * (buffer[0] / 1000.0) * (buffer[0] / 1000.0) + 428.7 * (buffer[0] / 1000.0);
        osal_printk("TDS:%d.%dppm, ", (int)ret, (int)(ret * 100.f) - (int)ret * 100);
    }
    else if(now_index == LIGHT)
    {
        ret = (5000.0 - (float)buffer[0]) / 5000.0 * (float)pow((double)2, (double)13);
        osal_printk("LIGHT:%d.%dlx\r\n", (int)ret, (int)(ret * 100.f) - (int)ret * 100);
    }
    memcpy(&sle_tx_buff[now_index - 3], &ret, 4);
}

void pH_TDS_DO_LIGHT_init(void)
{
    uapi_adc_init(ADC_CLOCK_500KHZ);
    uapi_adc_power_en(AFE_GADC_MODE, true);
}

/*
开启不同通道的自动扫描，再立马关掉，以此进行一次采样。数据在传给回调函数的形参数buffer里，所以要在进回调前先设置一下
索引，把读到的数据放到响应位置。
*/
void pH_TDS_DO_LIGHT_read(void)
{
    now_index = DO;
    uapi_adc_auto_scan_ch_enable(CHANNEL_DO, config, test_adc_callback);
    uapi_adc_auto_scan_ch_disable(CHANNEL_DO);
    now_index = PH;
    uapi_adc_auto_scan_ch_enable(CHANNEL_PH, config, test_adc_callback);
    uapi_adc_auto_scan_ch_disable(CHANNEL_PH);
    now_index = TDS;
    uapi_adc_auto_scan_ch_enable(CHANNEL_TDS, config, test_adc_callback);
    uapi_adc_auto_scan_ch_disable(CHANNEL_TDS);
    now_index = LIGHT;
    uapi_adc_auto_scan_ch_enable(CHANNEL_LIGHT, config, test_adc_callback);
    uapi_adc_auto_scan_ch_disable(CHANNEL_LIGHT);
}
